/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package swatsoft3.controlador;

import se.sics.prologbeans.*;
import java.io.*;
import java.util.*;
import gov.nih.nlm.nls.metamap.*;
import swatsoft3.modelo.BE_Frase;

/**
 *
 * @author renzo
 */
public class BL_GestorMetamap {

    public static final String enfermedad = "enfermedad";
    public static final String sintoma = "sintoma";
    public static final String cura = "cura";
    public static final String fraseNominal = "NOUN_PHRASE";
    public static final String frasePreposicional = "PREP_PHRASE";

    public static void asignarConceptoUnicoYTipoSemantico(BE_Frase frase) throws Exception {

        //conecta con el API
        MetaMapApi api = new MetaMapApiImpl();
        api.setHost(BL_GestorConfiguracion.dameIpServidorMetamap());
        //procesa semánticamente solo si es frase nominal 
        List<Result> resultado1 = api.processCitationsFromString(frase.getCadenaFrase());

        if (!resultado1.isEmpty()) {
            Result result = (Result) resultado1.get(0);

            //enfermedad= dsyn, mobd, neop
            //sintoma= sosy, fndg, patf
            //cura= topp, phsu, antb
            //el algoritmo es: tomar el primero que se encuentre
            if (!result.getUtteranceList().isEmpty() && !result.getUtteranceList().get(0).getPCMList().isEmpty() && !result.getUtteranceList().get(0).getPCMList().get(0).getMappingList().isEmpty() && !result.getUtteranceList().get(0).getPCMList().get(0).getMappingList().get(0).getEvList().isEmpty()) {
                String tipoSemantico = result.getUtteranceList().get(0).getPCMList().get(0).getMappingList().get(0).getEvList().get(0).getSemanticTypes().get(0);

                //el concepto único también se toma como el primero encontrado
                String conceptoUnico = result.getUtteranceList().get(0).getPCMList().get(0).getMappingList().get(0).getEvList().get(0).getConceptName();
                frase.setConceptoUnico(conceptoUnico);

                //asignando tipo semántico
                frase.setTipoSemantico(tipoSemantico);

                if (tipoSemantico.equals("dsyn") || tipoSemantico.equals("mobd") || tipoSemantico.equals("neop")) {
                    frase.setTipoSemantico(enfermedad);
                }

                if (tipoSemantico.equals("sosy")/*||tipoSemantico.equals("fndg")*/ || tipoSemantico.equals("patf")) {
                    frase.setTipoSemantico(sintoma);
                    if (conceptoUnico.equalsIgnoreCase("Others")) {
                        frase.setTipoSemantico("otro");
                    }
                }

                if (tipoSemantico.equals("topp") || tipoSemantico.equals("phsu") || tipoSemantico.equals("antb")) {
                    frase.setTipoSemantico(cura);
                }
                
               
            }
        }
        //no olvidar desconectar XD
        api.getSession().disconnect();
    }

    //Devuelve tipo Ev porque ahí se incluye concepto único y tipo semántico
    public static ArrayList<String> obtenerConceptoUnicoYTipoSemantico(String enfermedad) throws Exception {

        //Inicializar variables
        //En 0 va el tipo semántico y en 1 el concepto único
        ArrayList<String> resultado = null;
        Ev aux = null;

        //conecta con el API, el IP está en BL_GestorConfiguracion
        MetaMapApi api = new MetaMapApiImpl();
        api.setHost(BL_GestorConfiguracion.dameIpServidorMetamap());

        //Analiza semánticamente el término ingresado
        List<Result> resultado1 = api.processCitationsFromString(enfermedad);

        if (!resultado1.isEmpty()) {
            Result result = (Result) resultado1.get(0);

            //el algoritmo es: tomar el primer resultado tipo Ev que se encuentre
            aux = result.getUtteranceList().get(0).getPCMList().get(0).getMappingList().get(0).getEvList().get(0);

            String tipoSemantico = aux.getSemanticTypes().get(0);
            String conceptoUnico = aux.getConceptName();

            if (tipoSemantico.equals("dsyn") || tipoSemantico.equals("mobd") || tipoSemantico.equals("neop")) {
                tipoSemantico = BL_GestorMetamap.enfermedad;
            }

            resultado = new ArrayList<String>();
            resultado.add(0, tipoSemantico);
            resultado.add(1, conceptoUnico);
        }

        //desconectar para no sobrecargar al servidor
        api.getSession().disconnect();

        return resultado;
    }
}
